import pandas as pd  
import matplotlib.pyplot as plt  
import matplotlib.patches as patches  
from matplotlib import rcParams  

# 设置中文字体以支持中文字符  
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体  
rcParams['axes.unicode_minus'] = False   # 避免负号显示问题  

# 读取 CSV 文件  
csv_file = "task_log.csv"  # 替换为您的文件路径  
data = pd.read_csv(csv_file)  

# 转换时间片为实际时间（以秒为单位）  
time_unit = 48 / 1000  # 每个时间片为 48ms，转换为秒  
data['StartTime'] = data['StartTime'] * time_unit  # 转换开始时间  
data['EndTime'] = data['EndTime'] * time_unit  # 转换结束时间  
data['Duration'] = data['EndTime'] - data['StartTime']  # 计算持续时间  

def plot_task_timeline(data):  
    fig, ax = plt.subplots(figsize=(12, 8))  

    # 过滤掉任务类型为 "Link" 的记录  
    data = data[data['RobotType'] != 'Link'].reset_index(drop=True)  

    # 为每个任务分配唯一的轨道索引  
    task_indices = range(len(data))  
    data['Track'] = task_indices  

    # 遍历每个任务并绘制矩形  
    for _, row in data.iterrows():  
        start_time, end_time = row['StartTime'], row['EndTime']  
        track = row['Track']  # Y 轴位置  
        part_id = row['PartID']  # PartID（在矩形内部显示）  
        work_piece_name = row['工件名']  # 工件名称  
        robot_type = row['RobotType']  # 机器人类型  

        duration = end_time - start_time  # 持续时间  
        rect = patches.Rectangle(  
            (start_time, track - 0.4),  # 矩形左下角  
            duration,  # 矩形的宽度对应持续时间  
            0.8,  # 矩形高度  
            facecolor="skyblue",  
            edgecolor="black",  
            alpha=0.8,  
        )  
        ax.add_patch(rect)  

        # 矩形中间显示 PartID 和 RobotType  
        ax.text(  
            start_time + duration / 2,  # 中点  
            track,  
            f"PartID:{part_id}-{robot_type}",  
            ha="center",  
            va="center",  
            fontsize=9,  
            color="black"  
        )  

    # 设置时间轴范围  
    ax.set_xlim(data['StartTime'].min(), data['EndTime'].max())  
    ax.set_ylim(-1, len(data))  # 轨道范围对应任务数  

    # 设置 Y 轴为工件名  
    ax.set_yticks(range(len(data)))  
    ax.set_yticklabels(data['工件名'])  # Y 轴标签为工件名  

    # 美化显示  
    ax.set_xlabel("Time (seconds)")  
    ax.set_ylabel("Work Pieces (工件名)")  # 标注中文  
    ax.grid(axis="x", linestyle="--", alpha=0.5)  
    plt.title("Robot Task Timeline (任务时间轴)")  
    plt.tight_layout()  
    plt.show()  

# 调用绘图函数  
plot_task_timeline(data)